from __future__ import annotations  # 启用延迟注解求值
from typing import List, TypedDict, Dict

from docx import Document
from docx.enum.text import WD_LINE_SPACING
from docx.opc.oxml import qn
from docx.shared import Pt, RGBColor, Inches, Cm
from langchain_openai.chat_models.base import BaseChatOpenAI
from langgraph.graph import StateGraph
from sqlalchemy.testing.suite.test_reflection import metadata

# from test.MetaSource import MetaSource, Task


# 是一个树形结构
class ChapterSpec(TypedDict):
    title: str  # 章节标题
    pageLimit: int  # 该章节页数限制
    spec: str  # 该章节的要求：自然语言描述
    subChapterSpec: List[ChapterSpec]  # 子章节
    done: False  # 是否已完成


class TechSpec(TypedDict):
    overview: str  # 概述
    functions: List[str]  # 功能
    performances: List[str]  # 性能
    title: str # 标题
    level:int # 标题等级
    spec:str # 要求
    wordCountLimit:int #字数要求限制
    # chapterSpec: List[ChapterSpec]  # 对章节划分的要求


class TechsolutionState(TypedDict):
    sourceSpec: TechSpec
    result: str


chatllm = BaseChatOpenAI(
    model='deepseek-chat',
    openai_api_key='sk-f2388ce4574d44cdafddbaf8aa5d20f5',
    openai_api_base='https://api.deepseek.com',
    max_tokens=1024*10
)

reasonerllm = BaseChatOpenAI(
    model='deepseek-reasoner',
    openai_api_key='sk-f2388ce4574d44cdafddbaf8aa5d20f5',
    openai_api_base='https://api.deepseek.com',
    max_tokens=1024*64,
    stream_usage =False,
    stop = None,
    frequency_penalty = -0.5
)


def parse_tender(state: TechsolutionState):
    techSpec = state['sourceSpec']
    overview = techSpec['overview']
    functions = techSpec['functions']
    performances = techSpec['performances']
    spec = techSpec['spec']   # 要求
    # wordCountLimit = techSpec['wordCountLimit']
    prompt = f'''
            你是一个资深的技术解决方案标书撰写专家,现在有一个标书的技术解决方案部分需要你去撰写
            你能提到的信息:
             1. 根据标书技术部分的概述、功能、性能三个方面的内容
             2. 根据约定、撰写标书系统需要划分为以下七个模块：监测站网观测数据引接模块、空间地理信息数据引接模块、动态位置数据引接模块、行业实时数据引接模块、系统对民服务数据引接模块、数据源扩展配置模块和引接任务可视化管理模块
             你的任务:
              1. 根据标书技术部分的内容充分理解,得出系统的解决方案
              2. 根据解决方案, 将系统划分为7个模块：监测站网观测数据引接模块、空间地理信息数据引接模块、动态位置数据引接模块、行业实时数据引接模块、系统对民服务数据引接模块、数据源扩展配置模块和引接任务可视化管理模块
              3. 对各模块进一步划分其功能
              4. 根据输出要求，生成指定的内容,内容中更不需要输出提示词中的限制信息
              概述：{overview}
              功能：{functions}
              性能：{performances}
              输出要求：
             {spec}
        '''
    print(prompt)
#     prompt = f"""
#             你是一个资深的技术解决方案标书撰写专家,
#             你能提到的信息:
#               1. 根据标书技术部分的概述、功能、性能三个方面的内容
#               2. 撰写标书系统需要划分为以下七个模块：监测站网观测数据引接模块、空间地理信息数据引接模块、动态位置数据引接模块、行业实时数据引接模块、系统对民服务数据引接模块、数据源扩展配置模块和引接任务可视化管理模块
#
#             你的任务:
#               1. 根据标书技术部分的内容充分理解,得出系统的解决方案
#               2. 根据解决方案, 将系统划分为7个模块：监测站网观测数据引接模块、空间地理信息数据引接模块、动态位置数据引接模块、行业实时数据引接模块、系统对民服务数据引接模块、数据源扩展配置模块和引接任务可视化管理模块
#               3. 对各模块进一步划分其功能
#               4. 根据输出要求，生成指定的内容
#             概述：{overview}
#             功能：{functions}
#             性能：{performances}
#             输出要求：
#                1. 输出500000字(不包括代码和图片、流程图、架构图等)以上、可直接复制到Microsoft Word/WPS的富文本连续内容（无分段符号）  ：可以是文本、代码、流程图、架构图等,限制如下
#                   . 完全禁用Markdown语法（禁止使用 # * ** ``` 等符号）
#                   . 使用以下替代格式：
#                      - 标题：使用[]包围 + 字体增大（如[一级标题]16pt）
#                       - 加粗：〈文本〉
#                       - 斜体：文本
#                      - 列表：使用数字编号(1)(2)或汉字编号一、二、
#                   . 段落首行空两格（自动生成）
#                   . 表格使用制表符分隔：
#                           列1\t列2\t列3
#                           内容1\t内容2\t内容3
#                   . 特殊符号替换：
#                          * → ×
#                          # → ■
#                          ` → '
#                2. 使用最成熟和保守的技术
#
#                3. 禁止：
#                   • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
#                   • 禁止使用成熟的方案、避免任何超前的设计
#                4. 格式要求：
#                    [系统概述]\n
#                     根据"总-分-总"的原则，介绍系统概述
#                       -首段，介绍对需求的详细理解和阐述，至少需要21000字的连续内容(无分段符号)，如果不满足字数，请说明原因
#                       -主体:至少需要41000字的连续内容(无分段符号)，如果不满足字数，请说明原因
#                          介绍系统解决方案的设计原则、设计思路和优点
#                       -结尾：总结本先解决方案的完整性和适用性，至少需要21000字的连续内容(无分段符号)，如果不满足字数，请说明原因
#
#                    [技术路线]\n
#                     {{详细介绍系统解决方案如何实现,依靠什么技术、这些技术如何使用、以及如何实现的路线图，要求至少20000字的连续内容(无分段符号)}}
#         [系统架构]
#         {{详细介绍系统解决方案的系统结构，根据“总-分-总”的原则，首先介绍系统架构的特点，其次语言平滑的过度到给出架构图以及对架构图的详细阐述，最后总结架构的优点（至少10000字）}}
#        [系统数据架构]
#        {{ 采用"总-分-总"结构：
#              - 首段：详细描述项目系统数据的类型(5000字)
#              - 主体：(40000字)
#                 2.1使用mermaid输出数据架构图
#                 2.2 遍历详细介绍数据架构中每部分
#                   2.2.1 介绍每部分的数据来源、类型、存储
#                   2.2.2 详细介绍数据架构每部分的数据的概念模型(识别业务域)、逻辑模型(实体关系ER)和物理模型(表字段)
#                   2.2.3 详细介绍数据架构每部分的数据治理方式
#              - 结尾：描述架构的完整性和适用性(5000字)}}
#        [系统组成]
#        {{详细介绍系统由以下模块组成：监测站网观测数据引接模块、空间地理信息数据引接模块、动态位置数据引接模块、行业实时数据引接模块、系统对民服务数据引接模块、数据源扩展配置模块和引接任务可视化管理模块,给出组成的结构图，详细介绍每个模块的功能（至少10000字）。}}
#        [系统工作流程]
#        {{详细介绍系统解决方案中业务的工作流程，按照总分总的原则，首先概括介绍系统的工作流程、其次语言平滑过度到给出流程图以及对流程图的详细阐述，最终总结设计流程的优点（至少20000字）}}
#        [系统接口]
#        {{根据"总-分-总"的原则，首先概括介绍系统各模块之间的接口设计，其次语言平滑过度到给出相互调用接口的拓扑图，以及对拓扑图的详细阐述，最后总结系统接口设计的优点。（至少20000字）}}
#        [模块设计]
#             {{首先接收系统的模块组成部分, 其次遍历所有模块输出： 每个模块至少10000字
#                for 模块 in 模块列表}}
#               [模块名]
#                  [模块概述]
#                     {{详细描述该模块的主要作用，至少1000字}}
#                  [模块组成]
#                      {{描述该模块的由那些功能组成}}
#                  {{遍历该模块所有功能： for 功能 in 功能列表}}
#                   [功能描述]
#                    {{该功能的详细描述，至少1000字}}
#                   [处理流程]
#                   {{该功能的处理流程，按照"总-分-总"的流程，先概括介绍，然后给出流程图和流程图的详细描述，最后给出总结，至少5000字}}
#                   [输入输出]
#                   {{该功能的输入输出，按照"总-分-总"的流程，先概括介绍，然后给出输入输出的表格，最后给出总结 ，至少10000字}}
#                   [实现方法]
#                    {{该功能的实现方法，按照"总-分-总"的流程，先概括实现原理，然后给实现途径和代码，最后给出总结，至少3000字 }}
#               5. 可以对使用到的相关技术或者协议理论阐述 ，以达到字数要求
#               6. 如果字数不够，请说明原因
#               7. 输入每个步骤的分析过程
#
# """

    # prompt = f"""
    #          你是一个资深的技术解决方案标书撰写专家,
    #          你能提到的信息:
    #            1. 根据标书技术部分的概述、功能、性能三个方面的内容
    #            2. 撰写标书需要符合章节目录结构及每章节的要求
    #          你的任务:
    #            1. 根据标书技术部分的内容充分理解,给出覆盖所有需求的完整解决方案
    #            2. 根据输出要求，生成内容：可以是文本、代码、流程图、架构图等
    #          概述：{overview}
    #          功能：{functions}
    #          性能：{performances}
    #          章节目录：
    #                  title： 系统数据架构，
    #          输出要求：
    #
    #                  1. 输出50000字以上的连续内容（无分段符号）
    #                  2. 采用"总-分-总"结构：
    #                  - 首段：详细描述项目系统数据的类型(5000字)
    #                  - 主体：(40000字)
    #                          2.1使用mermaid输出数据架构图
    #                          2.2 遍历详细介绍数据架构中每部分
    #                           2.2.1 介绍每部分的数据来源、类型、存储
    #                           2.2.2 详细介绍数据架构每部分的数据的概念模型(识别业务域)、逻辑模型(实体关系ER)和物理模型(表字段)
    #                           2.2.3 详细介绍数据架构每部分的数据治理方式
    #                  - 结尾：描述架构的完整性和适用性(5000字)
    #                  3. 使用最成熟和保守的技术，不包含任何标书需求外的功能和性能
    #                  4. 禁止：
    #                   • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                   • 禁止使用成熟的方案、避免任何超前的设计
    #                  5. 如果输出字数达不到要求、请说明理由
    #
    #
    #          """
    # prompt = f"""
    #         你是一个资深的技术解决方案标书撰写专家,
    #         你能提到的信息:
    #           1. 根据标书技术部分的概述、功能、性能三个方面的内容
    #           2. 撰写标书需要符合章节目录结构及每章节的要求
    #         你的任务:
    #           1. 根据标书技术部分的内容充分理解,给出覆盖所有需求的完整解决方案
    #           2. 根据输出要求，生成内容：可以是文本、代码、流程图、架构图等
    #         概述：{overview}
    #         功能：{functions}
    #         性能：{performances}
    #         章节目录：
    #                 title： 系统架构，
    #         输出要求：
    #
    #                 1. 输出50000字以上的连续内容（无分段符号）
    #                 2. 采用"总-分-总"结构：
    #                 - 首段：详细描述项目需求的理解、技术的选型和本架构设计的优点(5000字)
    #                 - 主体：(40000字)
    #                         2.1使用mermaid输出架构图
    #                         2.2 遍历详细介绍架构中每部分
    #                          2.2.1 介绍每部分的再结构中的作用
    #                          2.2.2 遍历详细介绍每部分中包含的协议，均用mermaid输出流程图，并详细讲解
    #                          2.2.3 遍历详细介绍架构中每部分包含技术点，需要包含源代码实现
    #                 - 结尾：描述架构的完整性和适用性(5000字)
    #                 3. 使用最成熟和保守的技术，不包含任何标书需求外的功能和性能
    #                 4. 禁止：
    #                  • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                  • 禁止使用成熟的方案、避免任何超前的设计
    #                 5. 如果输出字数达不到要求、请说明理由
    #
    #
    #         """
    # 1.
    # title：系统概述，要求：将系统的理解及解决方案，进行概括描述，最少3页
    # 2.
    # title： 技术路线，要求：详细讲解解决方案如何实现，使用何种技术等，至少5页
    # 3.
    # title：系统架构，要求：详细描述解决方案的系统结构，图文并茂、至少50页
    # for( chapter in chapterSpec):
    # prompt = prompt.
    # 输出JSON：{"relevant": bool, "reason": str}
    msg = reasonerllm.invoke(prompt)
    print(msg);
    state['result'] = msg.content
    return {"result": msg.content}


graph_builder = StateGraph(TechsolutionState)
graph_builder.add_node("parse_tender", parse_tender)
# graph_builder.add_node("word_generator", word_generator_node)
# Every response from  your chat bot will automatically go to the
# simulated user
# graph_builder.add_edge("web_retriever", "word_generator")
# graph_builder.add_conditional_edges(
#     "word_generator",
#     should_continue,
#     # If the finish criteria are met, we will stop the simulation,
#     # otherwise, the virtual user's message will be sent to your chat bot
#     {
#         "end": END,
#         "continue": "web_retriever",
#     },
# )
# The input will first go to your chat bot
# graph_builder.set_entry_point("parse_tender")
# simulation = graph_builder.compile()
# simulation.invoke({
#     "sourceSpec": {
#         "overview": "采用“框架+插件”的模式，新开发UDP、NTRip等接口插件，实现对某数据分析处理中心、试点省级分中心、十三五军民融合工程等的多源异构军民数据资源的引接汇聚，包括：系统对民服务数据、空间地理信息数据、CORS站网观测数据、民方实时点位数据、行业监测数据等五类数据，根据约定的接口协议进行格式解析、合理性检查等，对数据类型异常等情况进行初步筛查，将对应的各类结构化、半结构化、非结构化数据分类存储至引接库，为后续融合处理工作提供实体数据；支持专线安全网络的实时数据引接、离线批量导入存量数据等，同时支持各类数据引接及数据资源类型扩展。",
#         "functions": [
#             '1.具备国家信息中心、试点省级分中心、十三五军民融合工程项目等民用专线数据接入能力',
#             '2.具备实现传统关系型数据库、非关系型数据库、流式数据、文件系统等各种异构数据源高效的数据接入及同步功能',
#             '3.支持异构数据接入，可实现结构化数据、半结构化数据和非结构化数据的接入，包括但不限于常用地理信息数据格式文件以及日志文件、XML文件、JSON文件、WORD、PDF及各种格式的图片、音视频等',
#             '4.支持可视化界面化数据引接任务的配置、编排、管理、自适应启动，保障操作流程规范性；',
#             '5. 数据接入功能可扩展，在不影响原有数据接入情况下，可动态配置数据接入插件实现新增数据源、新增格式数据接入。'],
#         "performances": [
#             "支持引接数据类型≥5类，包括但不限于：系统对民服务数据、空间地理信息数据、监测站网观测数据、动态位置数据和行业实时数据等；",
#             "支持引接数据格式≥8类，包括但不限于：SHP、TIF、IMG、IFC、RVT、DGN、OSGB、RENIX等；",
#             "支持大于等于2000个监测站的数据流并行引接，具备平行扩展能力；",
#             "支持离线数据同步模式大于等于3类，包括但不限于：批量、全量、增量等，支持小时、周、月等自定义同步时间；",
#             "新接入CORS站数量：≥317个。"],
#         "chapterSpec": {}
#     }
#
# })

def composeState(overview: str,functions:str,performances:str,level:int,  title:str, spec :str):
    state = TechsolutionState();
    state.setdefault('sourceSpec', TechSpec())
    state['sourceSpec']['overview'] = overview
    state['sourceSpec']['functions'] = functions
    state['sourceSpec']['performances'] = performances
    state['sourceSpec']['title'] =  title
    state['sourceSpec']['level'] = level
    state['sourceSpec']['spec'] = spec
    return state
if __name__ == '__main__':
    overview =  "采用“框架+插件”的模式，新开发UDP、NTRip等接口插件，实现对某数据分析处理中心、试点省级分中心、十三五军民融合工程等的多源异构军民数据资源的引接汇聚，包括：系统对民服务数据、空间地理信息数据、CORS站网观测数据、民方实时点位数据、行业监测数据等五类数据，根据约定的接口协议进行格式解析、合理性检查等，对数据类型异常等情况进行初步筛查，将对应的各类结构化、半结构化、非结构化数据分类存储至引接库，为后续融合处理工作提供实体数据；支持专线安全网络的实时数据引接、离线批量导入存量数据等，同时支持各类数据引接及数据资源类型扩展。";
    functions = f'''
            1.具备国家信息中心、试点省级分中心、十三五军民融合工程项目等民用专线数据接入能力,
            2.具备实现传统关系型数据库、非关系型数据库、流式数据、文件系统等各种异构数据源高效的数据接入及同步功能,
            3.支持异构数据接入，可实现结构化数据、半结构化数据和非结构化数据的接入，包括但不限于常用地理信息数据格式文件以及日志文件、XML文件、JSON文件、WORD、PDF及各种格式的图片、音视频等,
            4.支持可视化界面化数据引接任务的配置、编排、管理、自适应启动，保障操作流程规范性；,
            5. 数据接入功能可扩展，在不影响原有数据接入情况下，可动态配置数据接入插件实现新增数据源、新增格式数据接入。
         '''
    performances =f'''
            1.支持引接数据类型≥5类，包括但不限于：系统对民服务数据、空间地理信息数据、监测站网观测数据、动态位置数据和行业实时数据等；,
            2.支持引接数据格式≥8类，包括但不限于：SHP、TIF、IMG、IFC、RVT、DGN、OSGB、RENIX等；
            3.支持大于等于2000个监测站的数据流并行引接，具备平行扩展能力；
            4.支持离线数据同步模式大于等于3类，包括但不限于：批量、全量、增量等，支持小时、周、月等自定义同步时间；
    '''
    # metadata = MetaSource(overview, functions, performances);

    states = []
    states.append( composeState(overview,functions,performances,1,"系统概述",
   f'''  1.输出内容可以是文本、代码、流程图/结构图等任意形式
               2.使用最成熟和保守的技术
               3.内容要求：此部分仅输出与系统概述相关的内容，至少需要10000字的前后具备连贯性的连续内容,有层次关系的需要分行
                  可以概括描述如下内容： 需求分析、实现目标、设计与架构、开发与编码、测试与质量保证、部署与维护
               4. 禁止：
                   • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
                   • 禁止使用成熟的方案、避免任何超前的设计
                   • 禁止具体技术的版本       
                   • 完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    states.append(composeState(overview,functions,performances,1,"技术路线",
                               f'''1.输出内容可以是文本、代码、流程图/结构图等任意形式
               2.使用最成熟和保守的技术
               3.内容要求：此部分仅输出与技术路线相关的内容，至少需要10000字的前后具备连贯性的连续内容(无分段符号)，可以包括如下内容： 技术选型、技术与业务的结合、系统实现的路线图
               4.
               4. 禁止：
                   • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
                   • 禁止使用成熟的方案、避免任何超前的设计
                   • 禁止具体技术的版本         
                   • 完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append(composeState(overview,functions,performances,1,"技术架构",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                 • 禁止使用成熟的方案、避免任何超前的设计
    #                 •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append(composeState(overview,functions,performances,1,"数据架构",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                • 禁止使用成熟的方案、避免任何超前的设计
    #                •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append( composeState(overview,functions,performances,1,"系统组成",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                • 禁止使用成熟的方案、避免任何超前的设计
    #                •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append(composeState(overview,functions,performances,1,"系统工作流程",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                 • 禁止使用成熟的方案、避免任何超前的设计
    #                 •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append( composeState(overview,functions,performances,1,"系统接口",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                 • 禁止使用成熟的方案、避免任何超前的设计
    #                 •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))
    # states.append( composeState(overview,functions,performances,1,"模块设计",f'''  1. 输出内容可以是文本、代码、流程图/结构图等任意形式
    #            2. 使用最成熟和保守的技术
    #            3.格式要求：根据"总-分-总"的原则，介绍系统概述
    #                    -首段，介绍对需求的详细理解和阐述，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                    -主体:至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #                         介绍系统解决方案的设计原则、设计思路和优点
    #                   -结尾：总结本先解决方案的完整性和适用性，至少需要10000字的连续内容(无分段符号)，如果不满足字数，请说明原因
    #             4. 禁止：
    #                • 禁止生成概述、功能、性能以外的任何内容和指标、避免实现的复杂性
    #                 • 禁止使用成熟的方案、避免任何超前的设计
    #                 •完全禁用Markdown语法（禁止使用 # * ** ``` 等符号） 但是可以保留，。；换行符等 '''))


    graph_builder.set_entry_point("parse_tender")
    graph_builder.set_finish_point("parse_tender")

    simulation = graph_builder.compile()
    doc = Document()
    for state in states:
      resp = simulation.invoke(state)
      content = resp['result'];
      print(content)
      doc.add_heading(state['sourceSpec']['title'], level=1);
      paragraph = doc.add_paragraph(content);
      # 1. 设置行距为1.5倍
      paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE  # 多倍行距模式
      paragraph.paragraph_format.line_spacing = 1.5  # 1.5倍行距
      # 由于python-docx原生不支持直接设置字体为宋体，我们可以尝试通过段落样式来实现
      paragraph.paragraph_format.first_line_indent = Cm(0.75)  # 两个中文字符的宽度

      # paragraph.style.font.name = '宋体'  # 注意：这种方法在某些情况下可能不工作，因为Word的限制或字体支持问题。
      #
      # # 设置字体大小为四号字，四号字大约等于12磅（pt）
      # paragraph.style.font.size = Pt(12)
      # 3. 设置字体（需遍历所有Run设置）
      for run in paragraph.runs:
          run.font.name = '宋体'  # 设置字体
          run.font.size = Pt(14)  # 四号字（14磅）

          # 确保中文字体生效（重要！）
          # run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

    doc.save('test1.docx')
    # simulation.invoke(state)

# for chunk in simulation.stream({"messages": []}):
#     # Print out all events aside from the final end chunk
#     # if END not in chunk:
#         print(chunk)
#         print("----")